Conventionally, legacy platforms tend to be monolithic groupings of functionality. That is, a platform typically exposes the entirety of its functionality via its monolithic platform API. Applications make use of this API to operate on the platform.
Such a legacy platform tends to be versioned as a whole as it changes over time. Newer versions of the platform may or may not be a superset of older versions. That is, newer versions may or may not support all of the same functionality as older versions and, if they do, may not support the functionality in the same way. Thus, in order to guarantee proper operation, conventional applications must be explicitly developed to function on certain versions of a platform. In such cases, the decision as to which platforms an application will support must be made at development time (when the application is being created) as opposed to at run-time (when the application is executing). As a result, applications designed and implemented for legacy platforms are tied to those platforms and will likely fail to operate properly on other platforms or platform versions.